/***************************************************************************
 创建者: 华磊
 开始时间: 2018.12.29
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:等待用户命令逻辑处理类
 *
 *                                                                         *
 ***************************************************************************/
#ifndef WAITCOMMANDINSTRUCTIONLOGIC_H
#define WAITCOMMANDINSTRUCTIONLOGIC_H
#include <qstring.h>
#include <QQueue>
#include <QMutex>
#include "MacroDefine/globalDefine.h"
#include "GeneralDefine.h"
#include "programset.h"
#include "instructionEnum.h"
#include "robotio.h"
#include <QObject>

class RegData;
class ProgramEngine;
/**
 * @brief The WaitCommandInstructionLogic class 等待webHmi的调度命令
 */
class WaitCommandInstructionLogic
{
public:
    WaitCommandInstructionLogic(int robotIdIn,ProgramSet* programSetIn,
                                RegData* regDataIn,ProgramEngine* programEngineIn);//
public:
    /**
     * @brief startWaitCommand 如果命令队列为空，则一直等待队列；不为空则把数据存入目标寄存器，结束本行运行，开始下一行运行。
     * 等待超过设定时间，则调整到超时标签。
     * @return
     */
    E_PROGRAM_LOOP_RESULT startWaitCommand(int programNumIn, const WaitCommandInstruction &instructionIn, int lineIndex);


    /**
     * @brief reset 复位队列
     * @return
     */
    int reset();
    /**
     * @brief addCommand　插入命令
     * @param commandIn
     * @return
     */
    int addCommand(UserCommandData commandIn);
    /**
     * @brief addMsg  , 添加消息反馈
     * @param messageLevel
     * @param componentName
     * @param messageType
     * @param messageCode
     * @param robotId
     * @param parameter1
     * @param parameter2
     * @param parameter3
     * @param parameter4
     */
    void addMsg( int messageLevel,
                 std::string componentName,
                 std::string messageType,
                 int messageCode,
                 int robotId,
                 int parameter1 = 0,
                 int parameter2 = 0,
                 int parameter3 = 0,
                 int parameter4 = 0,
                 QString message= "");
private:
    /**
     * @brief protectMutex 保护锁，用于队列
     */
    QMutex protectMutex;
    /**
     * @brief commandQueue 命令队列
     */
    QQueue<UserCommandData> commandQueue;
    
    RegData *regData;

    int robotId;
    ProgramSet* programSet;
    ProgramEngine* programEngine;
};

#endif // WAITCOMMANDINSTRUCTIONLOGIC_H
